#include <stdio.h>
#include <unistd.h>

#include "ohos_init.h"
#include "cmsis_os2.h"

#include "iot_gpio.h"
#include "hi_gpio.h"
#include "hi_io.h"
#include "hi_adc.h"
#include "hi_errno.h"
#include "net_demo.h"
#include "net_common.h"
#define GPIO_HIGH 1
#define GPIO_LOW 0

#define THRESHOLD 600
#define auto_detect 300000
#define detect 20000
#define PIR_GPIO_7 7
#define YELLOW_LED_GPIO_8 8

static state = 1;

int ADCTask(void)
{
    hi_u16 value;
    hi_u32 ret = hi_adc_read(HI_ADC_CHANNEL_3, &value, HI_ADC_EQU_MODEL_8, HI_ADC_CUR_BAIS_DEFAULT, 0);
    if (ret != HI_ERR_SUCCESS)
    {
        printf("ADC Read Fail\n");
        return -1;
    }
    return (int)value;
}

int PIRTask(int sigh)
{
    // state = 0;
    // if (sigh == -1)
    // {
    //     state = 1;
    //     IoTGpioSetOutputVal(YELLOW_LED_GPIO_8, GPIO_LOW);
    // }
    // else
    // {}
    int val = ADCTask();
    if (val >= THRESHOLD)
    {
        send(sigh, "Detected", sizeof("Detected"), 0);
        printf("PIR Detected\n");
        usleep(detect); // 20s
    }
    else
    {
        send(sigh, "Not Detected", sizeof("Not Detected"), 0);
        printf("PIR Not Detected\n");
        usleep(detect); // 20s
    }
}

int AutoPIRTask(void)
{
    while (1)
    {
        // if (state == 1)
        // {
        // }
        // else
        // {
        //     continue;
        // }
        // usleep(1000);
        int val = ADCTask();
        if (val >= THRESHOLD)
        {
            IoTGpioSetOutputVal(YELLOW_LED_GPIO_8, GPIO_HIGH);
            usleep(auto_detect);
        }
        else
        {
            IoTGpioSetOutputVal(YELLOW_LED_GPIO_8, GPIO_LOW);
            usleep(auto_detect);
        }
    }
}

void PIR_Start(void)
{
    // PIR
    hi_gpio_init();
    IoTGpioSetDir(YELLOW_LED_GPIO_8, IOT_GPIO_DIR_OUT);
    IoTGpioSetDir(PIR_GPIO_7, IOT_GPIO_DIR_IN);
    // IoTGpioRegisterIsrFunc(PIR_GPIO_7, IOT_GPIO_EDGE_RISE, PIRTask, NULL);
    osThreadAttr_t attr = {0};
    attr.name = "PIRTask";
    attr.attr_bits = 0U;
    attr.cb_mem = NULL;
    attr.cb_size = 0U;
    attr.stack_mem = NULL;
    attr.stack_size = 1024 * 3;
    attr.priority = osPriorityNormal1;

    if (osThreadNew((osThreadFunc_t)AutoPIRTask, NULL, &attr) == NULL)
    {
        printf("[UartDemo] Failed to create PIRTask!\n");
    }
}

SYS_RUN(PIR_Start);